﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using CncConvProg.Model;
using CncConvProg.Model.FileManageUtility;
using CncConvProg.Model.ThreadTable;
using CncConvProg.Model.Tool;
using CncConvProg.ViewModel.MainViewModel;
using CncConvProg.ViewModel.MVVM_Library;

namespace CncConvProg.ViewModel.Dialog
{
    public class MaterialiDialogoViewModel : ViewModelBase, IDialog
    {
        //private readonly MagazzinoUtensile _magazzinoUtensile;



        public MaterialiDialogoViewModel()
        {
            //_magazzinoUtensile = PathFolderHelper.GetMagazzinoUtensile();
        }

        //#region New Material

        //RelayCommand _addMaterialCmd;
        ///// <summary>
        ///// Salva modifiche database
        ///// </summary>
        //private void AddMaterial()
        //{
        //    var mat = new Materiale(Singleton.Instance.MeasureUnit);

        //    Singleton.Data.AddMateriale(mat);

        //    OnPropertyChanged("Materiali");
        //}

        //public ICommand AddMaterialCmd
        //{
        //    get
        //    {
        //        return _addMaterialCmd ?? (_addMaterialCmd = new RelayCommand(param => AddMaterial(),
        //                                                                      param => true));
        //    }
        //}

        //#endregion

        /*
         * su materiale cancellato eliminare i parametri 
         */
        public void Save(IMainViewModel mainViewModel)
        {
            Singleton.Data.SaveMagazzino();
        }

        public ObservableCollection<MaterialViewModel> Materiali
        {
            get
            {
                var mat = Singleton.Data.GetMateriali(Singleton.Instance.MeasureUnit);

                var rslt = new ObservableCollection<MaterialViewModel>();

                foreach (var viewModelBase in mat)
                {
                    rslt.Add(new MaterialViewModel(viewModelBase));
                }

                return rslt;
            }
        }

        public ObservableCollection<PrezzoMaterialeViewModel> PrezziMateriale
        {
            get
            {
                if (MaterialeSelezionato == null) return null;

                var prices = Singleton.Data.GetPrezziMateriale(MaterialeSelezionato.Materiale.MaterialeGuid, Singleton.Instance.MeasureUnit);

                var rslt = new ObservableCollection<PrezzoMaterialeViewModel>();

                foreach (var viewModelBase in prices)
                {
                    rslt.Add(new PrezzoMaterialeViewModel(viewModelBase));
                }

                return rslt;
            }
        }

        private MaterialViewModel _materialeSelezionato;
        public MaterialViewModel MaterialeSelezionato
        {
            get { return _materialeSelezionato; }

            set
            {
                _materialeSelezionato = value;
                PrezzoMaterialeSelezionato = null;
                OnPropertyChanged("MaterialeSelezionato");
                OnPropertyChanged("PrezziMateriale");

            }
        }

        private PrezzoMaterialeViewModel _prezzoMatSelezionato;
        public PrezzoMaterialeViewModel PrezzoMaterialeSelezionato
        {
            get { return _prezzoMatSelezionato; }

            set
            {
                _prezzoMatSelezionato = value;
                OnPropertyChanged("PrezzoMaterialeSelezionato");
            }
        }

        public Dictionary<byte, string> GruppiMaterialeLookup
        {
            get
            {
                var lookup = new Dictionary<byte, string>
                                 {
                                     {(byte)GruppoMaterialeType.P, "P"},
                                     {(byte)GruppoMaterialeType.M, "M"},
                                     {(byte)GruppoMaterialeType.K, "K"},
                                     {(byte)GruppoMaterialeType.N, "N"},
                                     {(byte)GruppoMaterialeType.H,"H"},
                                     {(byte)GruppoMaterialeType.S, "S"}
                                 };

                return lookup;

            }
        }

        #region New Material


        RelayCommand _newMatCmd;
        /// <summary>
        /// Salva modifiche database
        /// </summary>
        private void NewMaterial()
        {
            var materiale = new Materiale(Singleton.Instance.MeasureUnit) { Descrizione = "<New>" };

            Singleton.Data.AddMateriale(materiale);

            OnPropertyChanged("Materiali");
        }

        public ICommand NewMaterialCmd
        {
            get
            {
                return _newMatCmd ?? (_newMatCmd = new RelayCommand(param => NewMaterial(),
                                                                            param => true));
            }
        }

        #endregion

        #region Del Material


        RelayCommand _delMatCmd;
        /// <summary>
        /// Salva modifiche database
        /// </summary>
        private void DelMaterial()
        {
            if (MaterialeSelezionato == null) return;

            var name = MaterialeSelezionato.Descrizione;

            var msgBoxRslt = MessageBox.Show("Delete material ?", "Delete " + name, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No);

            if (msgBoxRslt != MessageBoxResult.Yes)
                return;

            Singleton.Data.DeleteMaterial(MaterialeSelezionato.Materiale);

            OnPropertyChanged("Materiali");
        }

        public ICommand DelMaterialCmd
        {
            get
            {
                return _delMatCmd ?? (_delMatCmd = new RelayCommand(param => DelMaterial(),
                                                                            param => MaterialeSelezionato != null));
            }
        }

        #endregion

        #region New Prezzzo


        RelayCommand _newPriceCmd;
        /// <summary>
        /// Salva modifiche database
        /// </summary>
        private void NewPrice()
        {
            var prezzo = new PrezzoMateriale
            {
                Descrizione = "<New>",
                MaterialeGuid = MaterialeSelezionato.Materiale.MaterialeGuid
            };

            Singleton.Data.AddPrezzoMateriale(prezzo);

            OnPropertyChanged("PrezziMateriale");
        }

        private bool CanAddPrice
        {
            get { return MaterialeSelezionato != null; }
        }

        public ICommand NewPrezzoCmd
        {
            get
            {
                return _newPriceCmd ?? (_newPriceCmd = new RelayCommand(param => NewPrice(),
                                                                        param => CanAddPrice));
            }
        }

        #endregion

        #region Del Prezzzo


        RelayCommand _delPriceCmd;
        /// <summary>
        /// Salva modifiche database
        /// </summary>
        private void DelPrice()
        {
            var p = PrezzoMaterialeSelezionato.PrezzoMateriale;
            Singleton.Data.DeletePrezzoMateriale(p);

            OnPropertyChanged("MaterialeSelezionato");
        }

        private bool CanDelPrice
        {
            get { return PrezzoMaterialeSelezionato != null; }
        }

        public ICommand DelPrezzoCmd
        {
            get
            {
                return _delPriceCmd ?? (_delPriceCmd = new RelayCommand(param => DelPrice(),
                                                                        param => CanDelPrice));
            }
        }

        #endregion
    }

    public class MaterialViewModel : ViewModelBase
    {
        public readonly Materiale Materiale;

        public MaterialViewModel(Materiale materiale)
        {
            Materiale = materiale;
        }


        public string Descrizione
        {
            get { return Materiale.Descrizione; }

            set
            {
                Materiale.Descrizione = value;
                OnPropertyChanged("Descrizione");
            }
        }

        public double PesoSpecifico
        {
            get { return Materiale.PesoSpecifico; }

            set
            {
                Materiale.PesoSpecifico = value;
                OnPropertyChanged("PesoSpecifico");
            }
        }
        public byte GruppoMateriale
        {
            get { return (byte)Materiale.GruppoMateriale; }

            set
            {
                Materiale.GruppoMateriale = (GruppoMaterialeType)value;
                OnPropertyChanged("GruppoMateriale");
            }
        }



    }

    public class PrezzoMaterialeViewModel : ViewModelBase
    {
        public readonly PrezzoMateriale PrezzoMateriale;

        public PrezzoMaterialeViewModel(PrezzoMateriale materiale)
        {
            PrezzoMateriale = materiale;
        }

        public string Descrizione
        {
            get { return PrezzoMateriale.Descrizione; }

            set
            {
                PrezzoMateriale.Descrizione = value;
                OnPropertyChanged("Descrizione");
            }
        }


        public double Prezzo
        {
            get { return PrezzoMateriale.Prezzo; }

            set
            {
                PrezzoMateriale.Prezzo = value;
                OnPropertyChanged("PrezzoMateriale");
            }
        }
    }



}
